package com.yc.spring.aop.动态代理;

import com.yc.spring.aop.静态代理.抽象主题_人;
import com.yc.spring.aop.静态代理.真实主题_被告;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLIB 动态字节码技术
 * 动态生成一个字节码文件, 动态加载到虚拟机中
 *
 *  public class 代理类 extends 被代理类{
 *      // 重写所有的方法
 *      public void say(){
 *          sout ...
 *          super.say(); // 执行被代理对象方法
 *          sout ...
 *      }
 *  }
 *
 */
public class CGLIB动态代理 {

    public static void main(String[] args) {
        抽象主题_人 a = new 真实主题_被告();
        抽象主题_人 律师 = CGLIB动态代理.proxy(a);
        律师.say();
        System.out.println("=====================");
        String test = 律师.hello("test");
        System.out.println(test);
    }

    public static <T> T proxy(T t){
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(t.getClass());
        // 设值方法回调, 方法拦截器
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("当事人的生命与财产受到威胁");
                Object ret = methodProxy.invoke(t, args);
                System.out.println("当事人的行为属于正当防卫");
                return ret;
            }
        });
        // 创建代理对象
        return (T) enhancer.create();
    }


}
